home *** CD-ROM | disk | FTP | other *** search
/ WOW! 2 / WOW - Vol 2.iso / pd_share / dfue / ka9qst / ka9q_src / main.c < prev    next >
C/C++ Source or Header  |  1994-10-16  |  20KB  |  862 lines

  1. /* Main network program - provides both client and server functions */
  2.  
  3. #define HOSTNAMELEN 32        /* changed from 16 by Bdale 860812 */
  4.  
  5. extern char startup[];        /* File to read startup commands from */
  6.  
  7. #include <stdio.h>
  8. #include "config.h"
  9. #include "global.h"
  10. #include "mbuf.h"
  11. #include "netuser.h"
  12. #include "timer.h"
  13. #include "icmp.h"
  14. #include "iface.h"
  15. #include "ip.h"
  16. #include "tcp.h"
  17. #include "ax25.h"
  18. #include "remote.h"
  19. #include "netrom.h"
  20. #include "ftp.h"
  21. #include "telnet.h"
  22. #include "session.h"
  23. #include "cmdparse.h"
  24.  
  25. #ifdef UNIX        /* BSD or SYS5 */
  26. #include "unix.h"
  27. #endif
  28.  
  29. #ifdef AMIGA
  30. #include "amiga.h"
  31. #endif
  32.  
  33. #ifdef MAC
  34. #include "mac.h"
  35. #endif
  36.  
  37. #ifdef MSDOS
  38. #include "pc.h"
  39. #endif
  40.  
  41. #ifdef ATARI_ST
  42. #include "st.h"
  43. #endif
  44.  
  45. #ifdef LATTICE
  46. extern long _MNEED;        /* reserve memory for child process (shell) */
  47. long _MNEED = 100000;        /* plucked out of thin air */
  48. extern long _32K;
  49. long _32K = 0x8000;        /* keep GST Linker happy */
  50. #endif
  51.  
  52. #ifdef    MWC
  53. long    _stksize = 0x40000L;    /* 256K oughta be enough... */
  54. #endif
  55.  
  56. #ifdef    TRACE
  57. #include "trace.h"
  58. /* Dummy structure for loopback tracing */
  59. struct interface loopback = { NULLIF, "loopback" };
  60. #endif
  61.  
  62. extern struct interface *ifaces;
  63. extern char version[];
  64. extern char implementation[];    /* DG2KK */
  65. extern struct mbuf *loopq;
  66.  
  67. int ttyflow;            /* NEW!!!!!!!! DG2KK */
  68. int mode;
  69. FILE *logfp;
  70. char badhost[] = "Unknown host %s\n";
  71. char hostname[HOSTNAMELEN];    
  72. unsigned nsessions = NSESSIONS;
  73. int32 resolve();
  74. int16 lport = 1001;
  75. char prompt[] = "net> ";
  76. char nospace[] = "No space!!\n";    /* Generic malloc fail message */
  77.  
  78.  
  79. #if    (!MSDOS && !ATARI_ST)        /* PC/Atari uses F-10 key always */
  80. static char escape = 0x1d;        /* default escape character is ^] */
  81. #endif
  82.  
  83. /* Command lookup and branch table */
  84. int go(),doax25(),cmdmode(),doconnect(),dotelnet(),doexit(),doclose(),
  85.     dohostname(),doreset(),dotcp(),dotrace(),doescape(),dohelp(),
  86.     doroute(),doecho(),dolog(),doip(),doetherstat(),
  87.     memstat(),doarp(),dosession(),doftp(),dostart(),dostop(),doattach(),
  88.     dosmtp(),doudp(),doparam(),doeol(),dohapnstat(),doremote(),
  89.     doegstat(),dodump(),dorecord(),doupload(),dokick(),domode(),doshell(),
  90.     dodir(),docd(),doatstat(),doping(),donetrom(),donrstat(),dotype();
  91.  
  92. static struct cmds cmds[] = {
  93.     /* The "go" command must be first */
  94.     "",        go,        0, NULLCHAR,    NULLCHAR,
  95.     "!",        doshell,    0, NULLCHAR,    NULLCHAR,
  96. #if    (MAC && APPLETALK)
  97.     "applestat",    doatstat,    0, NULLCHAR,    NULLCHAR,
  98. #endif
  99. #if    (AX25 || ETHER || APPLETALK)
  100.     "arp",        doarp,        0, NULLCHAR,    NULLCHAR,
  101. #endif
  102. #ifdef    AX25
  103.     "ax25",     doax25,     0, NULLCHAR,    NULLCHAR,
  104. #endif    
  105.     "attach",    doattach,    2,
  106.         "attach <hardware> <hw specific options>", NULLCHAR,
  107. /* This one is out of alpabetical order to allow abbreviation to "c" */
  108. #ifdef    AX25
  109.     "connect",    doconnect,    3,"connect interface callsign [digipeaters]",
  110.         NULLCHAR,
  111. #endif
  112. #ifndef UNIX    /* BSD or SYS5 */
  113.     "cd",        docd,        0, NULLCHAR,    NULLCHAR,
  114. #endif
  115.     "close",    doclose,    0, NULLCHAR,    NULLCHAR,
  116.     "disconnect",    doclose,    0, NULLCHAR,    NULLCHAR,
  117.     "dir",        dodir,        0, NULLCHAR,    NULLCHAR,
  118. #ifdef    EAGLE
  119.     "eaglestat",    doegstat,    0, NULLCHAR,    NULLCHAR,
  120. #endif
  121.     "echo",     doecho,     0, NULLCHAR,    "echo [refuse|accept]",
  122.     "eol",        doeol,        0, NULLCHAR,
  123.         "eol options: unix, standard",
  124. #if    (!MSDOS && !ATARI_ST)
  125.     "escape",    doescape,    0, NULLCHAR,    NULLCHAR,   
  126. #endif
  127. #ifdef    PC_EC
  128.     "etherstat",    doetherstat,    0, NULLCHAR,    NULLCHAR,
  129. #endif    PC_EC
  130.     "exit",     doexit,     0, NULLCHAR,    NULLCHAR,
  131.     "ftp",        doftp,        2, "ftp <address>",    NULLCHAR,
  132. #ifdef HAPN
  133.     "hapnstat",    dohapnstat,    0, NULLCHAR,    NULLCHAR,
  134. #endif HAPN
  135.     "help",     dohelp,     0, NULLCHAR,    NULLCHAR,
  136.     "hostname",    dohostname,    0, NULLCHAR,    NULLCHAR,
  137.     "kick",     dokick,     0, NULLCHAR,    NULLCHAR,
  138.     "log",        dolog,        0, NULLCHAR,    NULLCHAR,
  139.     "ip",        doip,        0, NULLCHAR,    NULLCHAR,
  140.     "memstat",    memstat,    0, NULLCHAR,    NULLCHAR,
  141. #ifdef    AX25
  142.     "mode",     domode,     2, "mode <interface>",    NULLCHAR,
  143.     "netrom",    donetrom,    0, NULLCHAR,    NULLCHAR,
  144.     "nrstat",    donrstat,    0, NULLCHAR,    NULLCHAR,
  145. #endif
  146.     "param",    doparam,    2, "param <interface>", NULLCHAR,
  147.     "ping",     doping,     0, NULLCHAR,    NULLCHAR,
  148. #ifndef UNIX /* BSD or SYS5 */
  149.     "pwd",        docd,        0, NULLCHAR,    NULLCHAR,
  150. #endif
  151.     "record",    dorecord,    0, NULLCHAR,    NULLCHAR,
  152.     "remote",    doremote,    4, "remote <address> <port> <command>",
  153.                             NULLCHAR,
  154.     "reset",    doreset,    0, NULLCHAR,    NULLCHAR,
  155.     "route",    doroute,    0, NULLCHAR,    NULLCHAR,
  156.     "session",    dosession,    0, NULLCHAR,    NULLCHAR,
  157.     "shell",    doshell,    0, NULLCHAR,    NULLCHAR,
  158.     "smtp",     dosmtp,     0, NULLCHAR,    NULLCHAR,
  159. #ifdef    SERVERS
  160.     "start",    dostart,    2, "start <servername>",NULLCHAR,
  161.     "stop",     dostop,     2, "stop <servername>", NULLCHAR,
  162. #endif
  163.     "tcp",        dotcp,        0, NULLCHAR,    NULLCHAR,
  164.     "telnet",    dotelnet,    2, "telnet <address>",    NULLCHAR,
  165. #ifdef    TRACE
  166.     "trace",    dotrace,    0, NULLCHAR,    NULLCHAR,
  167. #endif
  168.     "type",        dotype,        0, NULLCHAR,    NULLCHAR,
  169.     "udp",        doudp,        0, NULLCHAR,    NULLCHAR,
  170.     "upload",    doupload,    0, NULLCHAR,    NULLCHAR,
  171.     "?",        dohelp,     0, NULLCHAR,    NULLCHAR,
  172.     NULLCHAR,    NULLFP,     0,
  173.     "Unknown command; type \"?\" for list",   NULLCHAR, 
  174. };
  175.  
  176. #ifdef    SERVERS
  177. /* "start" and "stop" subcommands */
  178. int ftp_start(),smtp_start(),discard_start(),echo_start(),telnet_start();
  179. int tnc_start(), rem_start();
  180. static struct cmds startcmds[] = {
  181.     "discard",    discard_start,    0, NULLCHAR, NULLCHAR,
  182.     "echo",     echo_start,    0, NULLCHAR, NULLCHAR,
  183.     "ftp",        ftp_start,    0, NULLCHAR, NULLCHAR,
  184.     "remote",    rem_start,    0, NULLCHAR, NULLCHAR,
  185.     "smtp",     smtp_start,    0, NULLCHAR, NULLCHAR,
  186.     "telnet",    telnet_start,    0, NULLCHAR, NULLCHAR,
  187.     NULLCHAR,    NULLFP,     0,
  188.         "start options: discard, echo, ftp, remote, smtp, telnet",
  189.          NULLCHAR,
  190. };
  191. int ftp_stop(),smtp_stop(),echo_stop(),discard_stop(),telnet_stop(),
  192.     rem_stop();
  193. static struct cmds stopcmds[] = {
  194.     "discard",    discard_stop,    0, NULLCHAR, NULLCHAR,
  195.     "echo",     echo_stop,    0, NULLCHAR, NULLCHAR,
  196.     "ftp",        ftp_stop,    0, NULLCHAR, NULLCHAR,
  197.     "remote",    rem_stop,    0, NULLCHAR, NULLCHAR,
  198.     "smtp",     smtp_stop,    0, NULLCHAR, NULLCHAR,
  199.     "telnet",    telnet_stop,    0, NULLCHAR, NULLCHAR,
  200.     NULLCHAR,    NULLFP,     0,
  201.         "stop options: discard, echo, ftp, remote, smtp, telnet",
  202.          NULLCHAR,
  203. };
  204. #endif
  205.  
  206. void
  207. keep_things_going()
  208. {
  209.     void check_time();
  210.     struct interface *ifp;
  211.     struct mbuf *bp;
  212.  
  213.     /* Service the loopback queue */
  214.     if((bp = dequeue(&loopq)) != NULLBUF){
  215.         /* struct ip ip; */
  216. #ifdef    TRACE
  217.         dump(&loopback,IF_TRACE_IN,TRACE_IP,bp);
  218. #endif
  219.         /* Extract IP header */
  220.         /* ntohip(&ip,&bp);
  221.            ip_recv(&ip,bp,0); */
  222.         ip_recv(bp,0);
  223.     }
  224.     /* Service the interfaces */
  225.     for(ifp = ifaces; ifp != NULLIF; ifp = ifp->next){
  226.         if(ifp->recv != NULLFP)
  227.             (*ifp->recv)(ifp);
  228.     }
  229.  
  230.     /* Service the clock if it has ticked */
  231.     check_time();
  232.  
  233. #ifdef    MSDOS
  234.     /* Tell Doubledos to let the other task run for awhile.
  235.      * If Doubledos isn't active, this is a no-op.
  236.      */
  237.     giveup();
  238. #else
  239.     /* Wait until interrupt, then do it all over again */
  240.     eihalt();
  241. #endif
  242. }
  243.  
  244. main(argc,argv)
  245. int argc;
  246. char *argv[];
  247. {
  248.     static char inbuf[BUFSIZ];    /* keep it off the stack */
  249.     int c;
  250.     char *ttybuf,*fgets();
  251.     int16 cnt;
  252.     int ttydriv();
  253.     int cmdparse();
  254.     void check_time();
  255.     FILE *fp;
  256.  
  257.     ioinit();
  258. #if    (!UNIX && !AMIGA && !MAC && !ATARI_ST)
  259.     chktasker();
  260. #endif
  261. #ifdef    MSDOS
  262.     printf("KA9Q Internet Protocol Package, v%s DS = %x\n",version,
  263.         getds());
  264. #else
  265.     printf("KA9Q Internet Protocol Package, v%s\n",version);
  266. #endif
  267. /*    printf("%s\n",implementation);    */    /* DG2KK */
  268.     printf("Copyright 1988 by Phil Karn, KA9Q\n");
  269.     sessions = (struct session *)calloc(nsessions,sizeof(struct session));
  270.     if(argc > 1){
  271.         /* Read startup file named on command line */
  272.         fp = fopen(argv[1],"r");
  273.     } else {
  274.         fp = fopen(startup,"r");
  275.     }
  276.     if(fp != NULLFILE){
  277.         while(fgets(inbuf,BUFSIZ,fp) != NULLCHAR){
  278.             cmdparse(cmds,inbuf);
  279.         }
  280.         fclose(fp);
  281.     }        
  282.     cmdmode();
  283.  
  284.     /* Main commutator loop */
  285.     for(;;){
  286.         /* Process any keyboard input */
  287.         while((c = kbread()) != -1){
  288. #if  (MSDOS || ATARI_ST)
  289.             /* c == -2 means the command escape key (F10) */
  290.             if(c == -2){
  291.                 if(mode != CMD_MODE){
  292.                     printf("\n");
  293.                     cmdmode();
  294.                 }
  295.                 continue;
  296.             }
  297. #endif
  298. #ifdef SYS5
  299.             if(c == escape && escape != 0){
  300.                 if(mode != CMD_MODE){
  301.                     printf("\r\n");
  302.                     cmdmode();
  303.                 }
  304.                 continue;
  305.             }
  306. #endif     /* SYS5 */
  307. /* ----------------------------(DG2KK)------------------------------- */
  308. #ifndef FLOW
  309.             if((cnt = ttydriv(c,&ttybuf)) == 0)
  310.                 continue;
  311. #else
  312.             cnt = ttydriv(c,&ttybuf);
  313.             if (cnt == 0) {        /* should be != 0 */
  314.                 ttyflow = 0;    /* stop output to screen */
  315.             } else {
  316.                 ttyflow = 1;    /* restart output */
  317.                 if(mode != CMD_MODE)
  318.                     go();    /* display pending chars */
  319.             }
  320.             if (cnt == 0)
  321.                 continue;
  322. #endif FLOW
  323. /* ------------------------------------------------------------------ */
  324.             switch(mode){
  325.             case CMD_MODE:
  326.                 (void)cmdparse(cmds,ttybuf);
  327.                 fflush(stdout);
  328.                 break;
  329.             case CONV_MODE:
  330. #if    (!MSDOS && !ATARI_ST)
  331.                 if(ttybuf[0] == escape && escape != 0){
  332.                     printf("\n");
  333.                     cmdmode();
  334.                 } else
  335. #endif
  336.                     if(current->parse != NULLFP)
  337.                         (*current->parse)(ttybuf,cnt);
  338.  
  339.                 break;
  340.             }
  341.             if(mode == CMD_MODE){
  342.                 printf(prompt);
  343.                 fflush(stdout);
  344.             }
  345.         }
  346.         keep_things_going();
  347.     }
  348. }
  349. /* Standard commands called from main */
  350.  
  351. /* Enter command mode */
  352. int
  353. cmdmode()
  354. {
  355.     if(mode != CMD_MODE){
  356.         mode = CMD_MODE;
  357.         cooked();
  358.         printf(prompt);
  359.         fflush(stdout);
  360.         echo();
  361.     }
  362.     return 0;
  363. }
  364. static
  365. doexit()
  366. {
  367.     if(logfp != NULLFILE)
  368.         fclose(logfp);
  369.     iostop();
  370.     exit(0);
  371. }
  372. static
  373. dohostname(argc,argv)
  374. int argc;
  375. char *argv[];
  376. {
  377.     char *strncpy();
  378.  
  379.     if(argc < 2)
  380.         printf("%s\n",hostname);
  381.     else 
  382.         strncpy(hostname,argv[1],HOSTNAMELEN);
  383.     return 0;
  384. }
  385. static
  386. int
  387. dolog(argc,argv)
  388. int argc;
  389. char *argv[];
  390. {
  391.     char *strncpy();
  392.  
  393.     static char logname[15];
  394.     if(argc < 2){
  395.         if(logfp)
  396.             printf("Logging to %s\n",logname);
  397.         else
  398.             printf("Logging off\n");
  399.         return 0;
  400.     }
  401.     if(logfp){
  402.         fclose(logfp);
  403.         logfp = NULLFILE;
  404.     }
  405.     if(strcmp(argv[1],"stop") != 0){
  406.         strncpy(logname,argv[1],15);
  407.         logfp = fopen(logname,"a+");
  408.     }
  409.     return 0;
  410. }
  411. static
  412. int
  413. dohelp()
  414. {
  415.     register struct cmds *cmdp;
  416.     int i,j;
  417.  
  418.     printf("Main commands:\n");
  419.     for(i=0,cmdp = cmds;cmdp->name != NULL;cmdp++,i++){
  420.         printf("%s",cmdp->name);
  421.         if((i % 4) == 3)
  422.             printf("\n");
  423.         else {
  424.             for(j=strlen(cmdp->name);j < 16; j++)
  425.                 putchar(' ');
  426.         }
  427.     }
  428.     if((i % 4) != 0)
  429.         printf("\n");
  430.     return 0;
  431. }
  432.  
  433. doecho(argc,argv)
  434. int argc;
  435. char *argv[];
  436. {
  437.     extern int refuse_echo;
  438.  
  439.     if(argc < 2){
  440.         if(refuse_echo)
  441.             printf("Refuse\n");
  442.         else
  443.             printf("Accept\n");
  444.     } else {
  445.         if(argv[1][0] == 'r')
  446.             refuse_echo = 1;
  447.         else if(argv[1][0] == 'a')
  448.             refuse_echo = 0;
  449.         else
  450.             return -1;
  451.     }
  452.     return 0;
  453. }
  454. /* set for unix end of line for remote echo mode telnet */
  455. doeol(argc,argv)
  456. int argc;
  457. char *argv[];
  458. {
  459.     extern int unix_line_mode;
  460.  
  461.     if(argc < 2){
  462.         if(unix_line_mode)
  463.             printf("Unix\n");
  464.         else
  465.             printf("Standard\n");
  466.     } else {
  467.         if(strcmp(argv[1],"unix") == 0)
  468.             unix_line_mode = 1;
  469.         else if(strcmp(argv[1],"standard") == 0)
  470.             unix_line_mode = 0;
  471.         else {
  472.             return -1;
  473.         }
  474.     }
  475.     return 0;
  476. }
  477. /* Attach an interface
  478.  * Syntax: attach <hw type> <I/O address> <vector> <mode> <label> <bufsize> [<speed>]
  479.  */
  480. doattach(argc,argv)
  481. int argc;
  482. char *argv[];
  483. {
  484.     extern struct cmds attab[];
  485.  
  486.     return subcmd(attab,argc,argv);
  487. }
  488. /* Manipulate I/O device parameters */
  489. doparam(argc,argv)
  490. int argc;
  491. char *argv[];
  492. {
  493.     register struct interface *ifp;
  494.  
  495.     for(ifp=ifaces;ifp != NULLIF;ifp = ifp->next){
  496.         if(strcmp(argv[1],ifp->name) == 0)
  497.             break;
  498.     }
  499.     if(ifp == NULLIF){
  500.         printf("Interface \"%s\" unknown\n",argv[1]);
  501.         return 1;
  502.     }
  503.     if(ifp->ioctl == NULLFP){
  504.         printf("Not supported\n");
  505.         return 1;
  506.     }
  507.     /* Pass rest of args to device-specific code */
  508.     return (*ifp->ioctl)(ifp,argc-2,argv+2);
  509. }
  510.  
  511. /* -------------------------------------------------------- */
  512. /* Log messages of the form
  513.  * Tue Jan 31 00:00:00 1987 44.64.0.7:1003 open FTP
  514.  */
  515. /*VARARGS2*/
  516. log(tcb,fmt,arg1,arg2,arg3,arg4)
  517. struct tcb *tcb;
  518. char *fmt;
  519. int arg1,arg2,arg3,arg4;
  520. {
  521.     char *cp;
  522.     long t;
  523.     int fd;
  524.  
  525.     if(logfp == NULLFILE)
  526.         return;
  527.     time(&t);
  528.     cp = ctime(&t);
  529.     rip(cp);
  530.     /* log events which don't have an IP address (AX.25 connects etc) */
  531.     if (tcb != NULLTCB) {
  532.         fprintf(logfp,"%s %s - ",cp,psocket(&tcb->conn.remote));
  533.     } else {
  534.         fprintf(logfp,"%s - ",cp);
  535.     }
  536.     fprintf(logfp,fmt,arg1,arg2,arg3,arg4);
  537.     fprintf(logfp,"\n");
  538.     fflush(logfp);
  539. #if ( MSDOS || ATARI_ST )
  540.     /* MS-DOS doesn't really flush files until they're closed */
  541.     fd = fileno(logfp);
  542.     if((fd = dup(fd)) != -1)
  543.         close(fd);
  544. #endif
  545. }
  546. /* ------------------------------------------------------------------ */
  547.  
  548. /* Configuration-dependent code */
  549.  
  550. /* List of supported hardware devices */
  551. int ec_attach(),asy_attach(),pc_attach(),eg_attach(),hapn_attach(),at_attach(),
  552.     nr_attach();
  553.  
  554. struct cmds attab[] = {
  555. #ifdef    PC_EC
  556.     /* 3-Com Ethernet interface */
  557.     "3c500", ec_attach, 7, 
  558.     "attach 3c500 <address> <vector> arpa <label> <buffers> <mtu>",
  559.     "Could not attach 3c500",
  560. #endif
  561. #ifdef    SLIP
  562.     /* Ordinary PC asynchronous adaptor */
  563.     "asy", asy_attach, 8, 
  564. #ifndef    SLFP
  565.     "attach asy <address> <vector> slip|ax25 <label> <buffers> <mtu> <speed>",
  566. #else
  567.     "attach asy <address> <vector> slip|ax25|slfp <label> <buffers> <mtu> <speed>",
  568. #endif
  569.     "Could not attach asy",
  570. #endif
  571. #ifdef    PC100
  572.     /* PACCOMM PC-100 8530 HDLC adaptor */
  573.     "pc100", pc_attach, 8, 
  574.     "attach pc100 <address> <vector> ax25 <label> <buffers> <mtu> <speed>",
  575.     "Could not attach pc100",
  576. #endif
  577. #ifdef    EAGLE
  578.     /* EAGLE RS-232C 8530 HDLC adaptor */
  579.     "eagle", eg_attach, 8,
  580.     "attach eagle <address> <vector> ax25 <label> <buffers> <mtu> <speed>",
  581.     "Could not attach eagle",
  582. #endif
  583. #ifdef    HAPN
  584.     /* Hamilton Area Packet Radio (HAPN) 8273 HDLC adaptor */
  585.     "hapn", hapn_attach, 8,
  586.     "attach hapn <address> <vector> ax25 <label> <rx bufsize> <mtu> csma|full",
  587.     "Could not attach hapn",
  588. #endif
  589. #ifdef    APPLETALK
  590.     /* Macintosh AppleTalk */
  591.     "0", at_attach, 7,
  592.     "attach 0 <protocol type> <device> arpa <label> <rx bufsize> <mtu>",
  593.     "Could not attach Appletalk",
  594. #endif
  595. #ifdef AX25
  596.     /* Fake NET/ROM interface */
  597.     "netrom", nr_attach, 1,
  598.     "attach netrom",
  599.     "Could not attach netrom",
  600. #endif
  601.     NULLCHAR, NULLFP, 0,
  602.     "Unknown device",
  603.     NULLCHAR,
  604. };
  605.  
  606. /* Protocol tracing function pointers */
  607. #ifdef    TRACE
  608. int ax25_dump(),ether_dump(),ip_dump(),at_dump(),slfp_dump();
  609.  
  610. int (*tracef[])() = {
  611. #ifdef    AX25
  612.     ax25_dump,
  613. #else
  614.     NULLFP,
  615. #endif
  616.  
  617. #ifdef    ETHER
  618.     ether_dump,
  619. #else
  620.     NULLFP,
  621. #endif
  622.     ip_dump,
  623.  
  624. #ifdef    APPLETALK
  625.     at_dump,
  626. #else
  627.     NULLFP,
  628. #endif
  629.  
  630. #ifdef    SLFP
  631.     slfp_dump,
  632. #else
  633.     NULLFP,
  634. #endif
  635. };
  636. #else
  637. int (*tracef[])() = { NULLFP }; /* No tracing at all */
  638. dump(interface,direction,type,bp)
  639. struct interface *interface;
  640. int direction;
  641. unsigned type;
  642. struct mbuf *bp;
  643. {
  644. }
  645. #endif
  646.  
  647. #ifdef    AX25
  648. /* Set up a SLIP link to use AX.25 */
  649. kiss_attach(if_asy,srecv)
  650. struct interface *if_asy;
  651. int (**srecv)();
  652. {
  653.     int kiss_ioctl(),ax_send(),ax_output(),kiss_raw(),kiss_recv();
  654.  
  655.     axarp();
  656.     if(mycall.call[0] == '\0'){
  657.         printf("set mycall first\n");
  658.         free((char *)if_asy);
  659.         return -1;
  660.     }
  661.     if_asy->ioctl = kiss_ioctl;
  662.     if_asy->send = ax_send;
  663.     if_asy->output = ax_output;
  664.     if_asy->raw = kiss_raw;
  665.     if(if_asy->hwaddr == NULLCHAR)
  666.         if_asy->hwaddr = malloc(sizeof(mycall));
  667.     memcpy(if_asy->hwaddr,(char *)&mycall,sizeof(mycall));
  668.     *srecv = kiss_recv;
  669.     return 0;
  670. }
  671.  
  672.  
  673.  
  674. /* Set up a net/rom serial interface */
  675. nrs_attach(if_asy,call)
  676. struct interface *if_asy;
  677. char *call ;
  678. {
  679.     struct ax25_addr addr ;
  680.     int ax_send(),ax_output(),nrs_raw(),nrs_recv(),asy_ioctl();
  681.  
  682.     if (call == NULLCHAR) {                /* no call supplied? */
  683.         if(mycall.call[0] == '\0'){        /* try to use default */
  684.             printf("set mycall first or specify in attach statement\n");
  685.             return -1;
  686.         }
  687.         else
  688.             addr = mycall ;
  689.     }
  690.     else {                /* callsign supplied on attach line */
  691.         if (setcall(&addr,call) == -1) {
  692.             printf ("bad callsign on attach line\n") ;
  693.             return -1 ;
  694.         }
  695.     }
  696.  
  697.     if_asy->flags |= CONNECT_MODE;        /* DG2KK: was: IF_AX25 */
  698.     if_asy->recv = nrs_recv ;
  699.     if_asy->ioctl = asy_ioctl ;
  700.     if_asy->send = ax_send;
  701.     if_asy->output = ax_output;
  702.     if_asy->raw = nrs_raw;
  703.     if(if_asy->hwaddr == NULLCHAR)
  704.         if_asy->hwaddr = malloc(sizeof(addr));
  705.     memcpy(if_asy->hwaddr,(char *)&addr,sizeof(addr));
  706.     return 0;
  707. }
  708.  
  709.  
  710. /* Display or set IP interface control flags */
  711. domode(argc,argv)
  712. int argc;
  713. char *argv[];
  714. {
  715.     register struct interface *ifp;
  716.  
  717.     for(ifp=ifaces;ifp != NULLIF;ifp = ifp->next){
  718.         if(strcmp(argv[1],ifp->name) == 0)
  719.             break;
  720.     }
  721.     if(ifp == NULLIF){
  722.         printf("Interface \"%s\" unknown\n",argv[1]);
  723.         return 1;
  724.     }
  725.     if(argc < 3){
  726.         printf("%s: %s\n",ifp->name,
  727.          (ifp->flags & CONNECT_MODE) ? "VC mode" : "Datagram mode");
  728.         return 0;
  729.     }
  730.     switch(argv[2][0]){
  731.     case 'v':
  732.     case 'c':
  733.     case 'V':
  734.     case 'C':
  735.         ifp->flags = CONNECT_MODE;
  736.         break;
  737.     case 'd':
  738.     case 'D':
  739.         ifp->flags = DATAGRAM_MODE;
  740.         break;
  741.     default:
  742.         printf("Usage: %s [vc | datagram]\n",argv[0]);
  743.         return 1;
  744.     }
  745.     return 0;
  746. }
  747. #endif
  748.  
  749. #ifdef SERVERS
  750. dostart(argc,argv)
  751. int argc;
  752. char *argv[];
  753. {
  754.     return subcmd(startcmds,argc,argv);
  755. }
  756. dostop(argc,argv)
  757. int argc;
  758. char *argv[];
  759. {
  760.     return subcmd(stopcmds,argc,argv);
  761. }
  762. #endif SERVERS
  763.  
  764. #ifdef    TRACE
  765. static
  766. int
  767. dotrace(argc,argv)
  768. int argc;
  769. char *argv[];
  770. {
  771.     struct interface *ifp;
  772.  
  773.     if(argc < 2){
  774.         showtrace(&loopback);
  775.         for(ifp = ifaces; ifp != NULLIF; ifp = ifp->next)
  776.             showtrace(ifp);
  777.         return 0;
  778.     }
  779.     if(strcmp("loopback",argv[1]) == 0)
  780.         ifp = &loopback;
  781.     else 
  782.         for(ifp = ifaces; ifp != NULLIF; ifp = ifp->next)
  783.             if(strcmp(ifp->name,argv[1]) == 0)
  784.                 break;
  785.  
  786.     if(ifp == NULLIF){
  787.         printf("Interface %s unknown\n",argv[1]);
  788.         return 1;
  789.     }
  790.     if(argc >= 3)
  791.         ifp->trace = htoi(argv[2]);
  792.  
  793.     showtrace(ifp);
  794.     return 0;
  795. }
  796. /* Display the trace flags for a particular interface */
  797. static
  798. showtrace(ifp)
  799. register struct interface *ifp;
  800. {
  801.     if(ifp == NULLIF)
  802.         return;
  803.     printf("%s:",ifp->name);
  804.     if(ifp->trace & (IF_TRACE_IN | IF_TRACE_OUT)){
  805.         if(ifp->trace & IF_TRACE_IN)
  806.             printf(" input");
  807.         if(ifp->trace & IF_TRACE_OUT)
  808.             printf(" output");
  809.  
  810.         if(ifp->trace & IF_TRACE_HEX)
  811.             printf(" (Hex/ASCII dump)");
  812.         else if(ifp->trace & IF_TRACE_ASCII)
  813.             printf(" (ASCII dump)");
  814.         else
  815.             printf(" (headers only)");
  816.         printf("\n");
  817.     } else
  818.         printf(" tracing off\n");
  819.     fflush(stdout);
  820. }
  821. #endif
  822.  
  823. #if    (!MSDOS && !ATARI_ST)
  824. static
  825. int
  826. doescape(argc,argv)
  827. int argc;
  828. char *argv[];
  829. {
  830.     if(argc < 2)
  831.         printf("0x%x\n",escape);
  832.     else 
  833.         escape = *argv[1];
  834.     return 0;
  835. }
  836. #endif
  837.  
  838. static
  839. doremote(argc,argv)
  840. int argc;
  841. char *argv[];
  842. {
  843.     struct socket fsock,lsock;
  844.     struct mbuf *bp;
  845.  
  846.     lsock.address = ip_addr;
  847.     fsock.address = resolve(argv[1]);
  848.     lsock.port = fsock.port = atoi(argv[2]);
  849.     bp = alloc_mbuf(1);
  850.     if(strcmp(argv[3],"reset") == 0){
  851.         *bp->data = SYS_RESET;
  852.     } else if(strcmp(argv[3],"exit") == 0){
  853.         *bp->data = SYS_EXIT;
  854.     } else {
  855.         printf("Unknown command %s\n",argv[3]);
  856.         return 1;
  857.     }
  858.     bp->cnt = 1;
  859.     send_udp(&lsock,&fsock,0,0,bp,0,0,0);
  860.     return 0;
  861. }
  862.